package com.briup.day12;

public class ExceptionTest2 {
    public static void main(String[] args) throws ClassNotFoundException {
        /*
            解决异常的方式：
                1、乐观型：
                    哪怕JDK告知你这个地方可能出现异常，你也不主动对其进行处理，
                    而是将可能出现的异常向上抛出，如果出现异常由该方法的调用者进行处理；
                2、悲观型：
                    无论此处是否真的会出现异常，我们都主动的对可能出现的异常进行处理；
                    通过如下结构对异常进行处理
                    try{
                        将极有可能出现的异常放入到try代码块中，那么在程序运行时，
                        JVM就会监测此处出现的异常，如果出现异常，
                        try代码块中出现异常的代码及其之后的代码将中断执行，
                        转而执行catch代码块中的业务逻辑
                    }
                    catch(Exception e){
                        在catch代码块中，你可以指定捕获哪一个异常，抛出的异常对象是该类型时，
                        那么就会执行该catch代码块内的逻辑；
                        catch代码块可以同时存在多个，即可以同时处理多个异常类型，
                        但是编写catch代码块时要注意异常的大小范围，应该将小范围放在前，大范围放在后
                    }
                    finally{
                        finally代码块中的代码，无论是否出现异常都会执行；
                        所以我们通常在finally代码块中编写关闭资源的业务逻辑
                    }
            以上两种异常处理的方式，我们如何使用？
                在能够向上抛的地方就向上抛，在不能向上抛的地方我们在使用try..catch...finally
                对异常进行统一处理；
                在我们程序中即，main方法中调用了test方法，那么我们可以在test方法中对以上向上抛，
                而在main方法中必须使用try...catch...finally进行异常的主动处理
         */
        test();
    }

    private static void test() throws ClassNotFoundException {
        // 加载String类，forName()方法就存在一个需要被我们处理的异常：ClassNotFoundException
        // 我们在这里处理异常时，就可以使用乐观的处理方式==>通过throws关键字在方法定义上抛出异常
        Class<?> aClass = Class.forName("java.lang.String");
    }

    private static void test2() {
        // ServiceException是运行时异常，所以在编码期间可以不用显示的对其进行处理
        throw new ServiceException("模拟异常");
    }

    private static void test3() throws ClassNotFoundException {
        // ClassNotFoundException是一个编译时异常，在编码期间必须对其进行处理
        throw new ClassNotFoundException("类找不到");
    }
}
